/**
 * @param {number[]} nums
 * @return {number}
 */
/* 
方法思路
定义状态：设dp[i]为偷窃到第i个房屋时能获得的最大金额。
状态转移方程：
对于第i个房屋，有两种选择：
不偷窃第i个房屋，此时最大金额为dp[i-1]。
偷窃第i个房屋，此时不能偷窃第i-1个房屋，最大金额为dp[i-2] + nums[i]。
因此，状态转移方程为：dp[i] = max(dp[i-1], dp[i-2] + nums[i])。
初始条件：
dp[0] = nums[0]，只有一个房屋时，偷窃该房屋。
dp[1] = max(nums[0], nums[1])，有两个房屋时，选择金额较大的那个。
结果：dp[n-1]即为所求的最大金额，其中n是数组的长度。

代码解释
边界条件处理：如果数组为空，返回 0；如果只有一个房屋，返回该房屋的金额。
初始化 DP 数组：创建一个长度为n的数组dp，并初始化前两个元素。
填充 DP 数组：从第三个元素开始，根据状态转移方程计算每个位置的最大金额。
返回结果：返回dp数组的最后一个元素，即偷窃到最后一个房屋时的最大金额。
*/
var rob = function (nums) {
  const len = nums.length;
  if (len == 0)
    return 0;
  const dp = new Array(len + 1);
  dp[0] = 0;
  dp[1] = nums[0];
  for (let i = 2; i <= len; i++) {
    dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i - 1]);
  }
  return dp[len];
};